home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Magazine / Online / OpenURL / Developer / Source / prefs_applist.c < prev    next >
C/C++ Source or Header  |  1999-09-26  |  10KB  |  301 lines

  1. /*
  2. ** OpenURL - MUI preferences for openurl.library
  3. ** Written by Troels Walsted Hansen <troels@thule.no>
  4. ** Placed in the public domain.
  5. **
  6. ** This module contains the code to the AppList Group.mui subclass. It
  7. ** manages a single list of applications with associated buttons.
  8. */
  9.  
  10. #include "prefs_common.h"
  11. #include "prefs_main.h"
  12. #include "prefs_app.h"
  13. #include "prefs_prefswin.h"
  14. #include "prefs_applist.h"
  15.  
  16. /**************************************************************************/
  17.  
  18. static ULONG mNew          (struct IClass *cl, Object *obj, struct opSet *msg);
  19. static ULONG mGet          (struct IClass *cl, Object *obj, struct opGet *msg);
  20. static ULONG mAdd          (struct IClass *cl, Object *obj, struct MUIP_AppList_Add *msg);
  21. static ULONG mEdit         (struct IClass *cl, Object *obj, struct MUIP_AppList_Edit *msg);
  22. static ULONG mClone        (struct IClass *cl, Object *obj, struct MUIP_AppList_Clone *msg);
  23. static ULONG mDelete       (struct IClass *cl, Object *obj, struct MUIP_AppList_Delete *msg);
  24. static ULONG mActiveChanged(struct IClass *cl, Object *obj, struct MUIP_AppList_ActiveChanged *msg);
  25.  
  26. static SAVEDS ASM APTR ConstructFunc(REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) UBYTE *node);
  27. static SAVEDS ASM VOID DestructFunc (REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) UBYTE *node);
  28. static SAVEDS ASM LONG DisplayFunc(REG(a0) struct Hook *hook, REG(a2) char **array, REG(a1) UBYTE *node);
  29.  
  30. /**************************************************************************/
  31.  
  32. static ULONG mNew(struct IClass *cl, Object *obj, struct opSet *msg)
  33. {
  34.     Object *appl, *addb, *editb, *cloneb, *deleteb;
  35.  
  36.     obj = (Object *)DoSuperNew(cl, obj,
  37.         Child, appl = ListviewObject,
  38.             MUIA_CycleChain,        TRUE,
  39.             MUIA_Listview_DragType, MUIV_Listview_DragType_Immediate,
  40.             MUIA_Listview_List,     ListObject,
  41.                 InputListFrame,
  42.                 MUIA_List_DragSortable, TRUE,
  43.                 MUIA_List_Title,        TRUE,
  44.                 MUIA_List_Format,       ",",
  45.             End,
  46.         End,
  47.         Child, ColGroup(4),
  48.             Child, addb    = SimpleButton("_Add..."),
  49.             Child, editb   = SimpleButton("_Edit..."),
  50.             Child, cloneb  = SimpleButton("C_lone..."),
  51.             Child, deleteb = SimpleButton("_Delete"),
  52.         End,
  53.         TAG_MORE, msg->ops_AttrList);
  54.  
  55.     if(obj)
  56.     {
  57.         struct AppList_Data *data = INST_DATA(cl, obj);
  58.         struct TagItem *tags, *tag;
  59.         memset(data, '\0', sizeof(struct AppList_Data));
  60.  
  61.         /* init instance data */
  62.  
  63.         data->AppLstObj    = appl;
  64.         data->AddButObj    = addb;
  65.         data->EditButObj   = editb;
  66.         data->CloneButObj  = cloneb;
  67.         data->DeleteButObj = deleteb;
  68.  
  69.         for(tags = msg->ops_AttrList; tag = NextTagItem(&tags); )
  70.         {
  71.             switch(tag->ti_Tag)
  72.             {
  73.                 case MUIA_AppList_NodeNameOffset:
  74.                     data->NodeNameOffset = tag->ti_Data;
  75.                     break;
  76.  
  77.                 case MUIA_AppList_NodePathOffset:
  78.                     data->NodePathOffset = tag->ti_Data;
  79.                     break;
  80.  
  81.                 case MUIA_AppList_NodeSize:
  82.                     data->NodeSize = tag->ti_Data;
  83.                     break;
  84.  
  85.                 case MUIA_AppList_NodeEditWinClass:
  86.                     data->NodeEditWinClass = tag->ti_Data;
  87.                     break;
  88.  
  89.                 case MUIA_AppList_NodeEditWinIDAttr:
  90.                     data->NodeEditWinIDAttr = tag->ti_Data;
  91.                     break;
  92.  
  93.                 case MUIA_AppList_NodeEditWinLstAttr:
  94.                     data->NodeEditWinLstAttr = tag->ti_Data;
  95.                     break;
  96.  
  97.                 case MUIA_AppList_NewNodeName:
  98.                     data->NewNodeName = (STRPTR)tag->ti_Data;
  99.                     break;
  100.             }
  101.         }
  102.  
  103.         /* add hooks */
  104.  
  105.         data->ConstructHook.h_Entry = (HOOKFUNC)ConstructFunc;
  106.         data->ConstructHook.h_Data  = data;
  107.         set(appl, MUIA_List_ConstructHook, &data->ConstructHook);
  108.  
  109.         data->DestructHook.h_Entry = (HOOKFUNC)DestructFunc;
  110.         data->DestructHook.h_Data  = data;
  111.         set(appl, MUIA_List_DestructHook, &data->DestructHook);
  112.  
  113.         data->DisplayHook.h_Entry = (HOOKFUNC)DisplayFunc;
  114.         data->DisplayHook.h_Data  = data;
  115.         set(appl, MUIA_List_DisplayHook, &data->DisplayHook);
  116.  
  117.         /* listview */
  118.  
  119.         DoMethod(appl, MUIM_Notify, MUIA_List_Active, MUIV_EveryTime, obj, 1, MUIM_AppList_ActiveChanged);
  120.         DoMethod(appl, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, obj, 1, MUIM_AppList_Edit);
  121.  
  122.         /* buttons */
  123.  
  124.         DoMethod(obj, MUIM_MultiSet, MUIA_CycleChain, TRUE, addb, editb, 
  125.                  cloneb, deleteb, NULL);
  126.  
  127.         DoMethod(obj, MUIM_MultiSet, MUIA_Disabled, TRUE, 
  128.                 editb, cloneb, deleteb, NULL);
  129.  
  130.         /* list buttons */
  131.  
  132.         DoMethod(addb,    MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_AppList_Add);
  133.         DoMethod(editb,   MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_AppList_Edit);
  134.         DoMethod(cloneb,  MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_AppList_Clone);
  135.         DoMethod(deleteb, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_AppList_Delete);
  136.     }
  137.  
  138.     return((ULONG)obj);
  139. }
  140.  
  141. /**************************************************************************/
  142.  
  143. static ULONG mGet(struct IClass *cl, Object *obj, struct opGet *msg)
  144. {
  145.     struct AppList_Data *data = INST_DATA(cl,obj);
  146.  
  147.     switch(msg->opg_AttrID)
  148.     {
  149.         case MUIA_AppList_ListObj:
  150.             *(msg->opg_Storage) = (ULONG)data->AppLstObj;
  151.             return(TRUE);
  152.     }
  153.  
  154.     return(DoSuperMethodA(cl, obj, (Msg)msg));
  155. }
  156.  
  157. /**************************************************************************/
  158.  
  159. static ULONG mAdd(struct IClass *cl, Object *obj, struct MUIP_AppList_Add *msg)
  160. {
  161.     struct AppList_Data *data = INST_DATA(cl,obj);
  162.     UBYTE *node = AllocMem(data->NodeSize, MEMF_CLEAR);
  163.  
  164.     if(!node) return(FALSE);
  165.     strcpy(node + data->NodeNameOffset, data->NewNodeName);
  166.     DoMethod(data->AppLstObj, MUIM_List_InsertSingle, node, MUIV_List_Insert_Bottom);
  167.     FreeMem(node, data->NodeSize);
  168.     set(data->AppLstObj, MUIA_List_Active, xget(data->AppLstObj, MUIA_List_InsertPosition));
  169.     DoMethod(obj, MUIM_AppList_Edit);
  170.  
  171.     return(TRUE);
  172. }
  173.  
  174. /**************************************************************************/
  175.  
  176. static ULONG mEdit(struct IClass *cl, Object *obj, struct MUIP_AppList_Edit *msg)
  177. {
  178.     struct AppList_Data *data = INST_DATA(cl,obj);
  179.     UBYTE *node;
  180.  
  181.     DoMethod(data->AppLstObj, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &node);
  182.  
  183.     if(node)
  184.     {
  185.         DoMethod(_app(obj), MUIM_App_OpenWin, data->NodeEditWinClass, 
  186.                  data->NodeEditWinIDAttr, node, data->NodeEditWinLstAttr, 
  187.                  data->AppLstObj, TAG_END);
  188.     }
  189.  
  190.     return(TRUE);
  191. }
  192.  
  193. /**************************************************************************/
  194.  
  195. static ULONG mClone(struct IClass *cl, Object *obj, struct MUIP_AppList_Clone *msg)
  196. {
  197.     struct AppList_Data *data = INST_DATA(cl,obj);
  198.     ULONG active;
  199.     UBYTE *node;
  200.  
  201.     get(data->AppLstObj, MUIA_List_Active, &active);
  202.     DoMethod(data->AppLstObj, MUIM_List_GetEntry, active, &node);
  203.  
  204.     if(node)
  205.     {
  206.         DoMethod(data->AppLstObj, MUIM_List_InsertSingle, node, ++active);
  207.         set(data->AppLstObj, MUIA_List_Active, active);
  208.         DoMethod(obj, MUIM_AppList_Edit);
  209.     }
  210.  
  211.     return(TRUE);
  212. }
  213.  
  214. /**************************************************************************/
  215.  
  216. static ULONG mDelete(struct IClass *cl, Object *obj, struct MUIP_AppList_Delete *msg)
  217. {
  218.     struct AppList_Data *data = INST_DATA(cl,obj);
  219.     ULONG active;
  220.     UBYTE *node;
  221.  
  222.     get(data->AppLstObj, MUIA_List_Active, &active);
  223.     DoMethod(data->AppLstObj, MUIM_List_GetEntry, active, &node);
  224.  
  225.     if(node)
  226.     {
  227.         DoMethod(_app(obj), MUIM_App_CloseWin, data->NodeEditWinIDAttr, node);
  228.         DoMethod(data->AppLstObj, MUIM_List_Remove, active);
  229.     }
  230.  
  231.     return(TRUE);
  232. }
  233.  
  234. /**************************************************************************/
  235.  
  236. static ULONG mActiveChanged(struct IClass *cl, Object *obj, struct MUIP_AppList_ActiveChanged *msg)
  237. {
  238.     struct AppList_Data *data = INST_DATA(cl,obj);
  239.     APTR node;
  240.     DoMethod(data->AppLstObj, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &node);
  241.     DoMethod(obj, MUIM_MultiSet, MUIA_Disabled, !node, data->EditButObj,
  242.              data->CloneButObj, data->DeleteButObj, NULL);
  243.     return(TRUE);
  244. }
  245.  
  246. /**************************************************************************/
  247.  
  248. SAVEDS ASM ULONG AppList_Dispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  249. {
  250.     switch(msg->MethodID)
  251.     {
  252.         case OM_NEW                    : return(mNew          (cl,obj,(APTR)msg));
  253.         case OM_GET                    : return(mGet          (cl,obj,(APTR)msg));
  254.         case MUIM_AppList_Add          : return(mAdd          (cl,obj,(APTR)msg));
  255.         case MUIM_AppList_Edit         : return(mEdit         (cl,obj,(APTR)msg));
  256.         case MUIM_AppList_Clone        : return(mClone        (cl,obj,(APTR)msg));
  257.         case MUIM_AppList_Delete       : return(mDelete       (cl,obj,(APTR)msg));
  258.         case MUIM_AppList_ActiveChanged: return(mActiveChanged(cl,obj,(APTR)msg));
  259.     }
  260.  
  261.     return(DoSuperMethodA(cl,obj,msg));
  262. }
  263.  
  264. /**************************************************************************/
  265.  
  266. static SAVEDS ASM APTR ConstructFunc(REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) UBYTE *node)
  267. {
  268.     struct AppList_Data *data = (struct AppList_Data *)hook->h_Data;
  269.     UBYTE *new;
  270.     if((new = AsmAllocPooled(pool, data->NodeSize, SysBase)))
  271.         memcpy(new, node, data->NodeSize);
  272.     return(new);
  273. }
  274.  
  275. /**************************************************************************/
  276.  
  277. static SAVEDS ASM VOID DestructFunc (REG(a0) struct Hook *hook, REG(a2) APTR pool, REG(a1) UBYTE *node)
  278. {
  279.     struct AppList_Data *data = (struct AppList_Data *)hook->h_Data;
  280.     AsmFreePooled(pool, node, data->NodeSize, SysBase);
  281. }
  282.  
  283. /**************************************************************************/
  284.  
  285. static SAVEDS ASM LONG DisplayFunc(REG(a0) struct Hook *hook, REG(a2) char **array, REG(a1) UBYTE *node)
  286. {
  287.     if(node)
  288.     {
  289.         struct AppList_Data *data = (struct AppList_Data *)hook->h_Data;
  290.         *array++ = (node + data->NodeNameOffset);
  291.         *array   = (node + data->NodePathOffset);
  292.     }
  293.     else
  294.     {
  295.         *array++ = MUIX_B "Name";
  296.         *array   = MUIX_B "Path";
  297.     }
  298.  
  299.     return(0);
  300. }
  301.